/**
 * EmojiGenerator - AI 表情包生成器
 *
 * 使用 GitCode API 生成自定义表情包
 */

import { defaultApiService } from './GitCodeApiService';

/**
 * 生成的表情包结果
 */
export interface GeneratedEmoji {
  id: string;
  url: string;
  prompt: string;
  timestamp: Date;
}

/**
 * 图片生成 API 响应
 */
interface ImageGenerationResponse {
  status: string;
  images?: string[];
  error?: string;
}

/**
 * 表情包生成器类
 */
export class EmojiGenerator {
  private apiUrl = 'https://api.gitcode.com/api/v5/images/generations';

  /**
   * 根据回复内容生成表情包
   * @param replyContent 回复内容
   * @param emotionalTone 情感基调
   * @returns 生成的表情包
   */
  async generateFromReply(replyContent: string, emotionalTone?: string): Promise<GeneratedEmoji> {
    const prompt = this.analyzeReplyAndGeneratePrompt(replyContent, emotionalTone);
    return this.generate(prompt);
  }

  /**
   * 分析回复内容并生成表情包提示词
   */
  private analyzeReplyAndGeneratePrompt(replyContent: string, emotionalTone?: string): string {
    const content = replyContent.toLowerCase();

    // 根据回复内容关键词匹配 - 使用多样化的动物和角色
    if (content.includes('哈哈') || content.includes('笑') || content.includes('好笑') || content.includes('太逗')) {
      return this.randomPick([
        '一只笑得前仰后合的柴犬，眼睛眯成一条线，卡通风格',
        '一只捧腹大笑的企鹅，笑到躺地上，Q版风格',
        '一只笑出眼泪的仓鼠，双手捂肚子，配字"笑死我了"',
        '一只开心大笑的海豹，圆滚滚的身体抖动，表情夸张',
      ]);
    }
    if (content.includes('震惊') || content.includes('惊讶') || content.includes('不敢相信') || content.includes('天哪')) {
      return this.randomPick([
        '一只震惊的柴犬，眼睛瞪得很大，嘴巴张开，表情夸张',
        '一只惊讶的猫头鹰，眼睛瞪成铜铃，羽毛炸开',
        '一只目瞪口呆的兔子，耳朵竖直，配字"什么？！"',
        '一只震惊的水獭，双手捂脸，表情夸张',
      ]);
    }
    if (content.includes('哭') || content.includes('难过') || content.includes('伤心') || content.includes('心疼')) {
      return this.randomPick([
        '一只流眼泪的小猫，委屈的表情，配字"呜呜呜"',
        '一只哭泣的小海豹，眼泪汪汪，圆圆的大眼睛',
        '一只伤心的小熊猫，抱着竹子哭泣，配字"好难过"',
        '一只流泪的小企鹅，低着头，翅膀下垂',
      ]);
    }
    if (content.includes('生气') || content.includes('愤怒') || content.includes('气死') || content.includes('讨厌')) {
      return this.randomPick([
        '一只愤怒的狼，眼睛发红，獠牙外露，冒着怒火',
        '一只炸毛的小猫，眉毛倒竖，冒着怒火，Q版风格',
        '一只生气的河豚，鼓成一个球，满脸怒气',
        '一只愤怒的小狮子，鬃毛炸开，配字"气死了！"',
      ]);
    }
    if (content.includes('累') || content.includes('疲惫') || content.includes('困') || content.includes('辛苦')) {
      return this.randomPick([
        '一只趴在桌子上的树懒，眼睛半睁，配字"好累啊"',
        '一只困倦的考拉，抱着树枝打瞌睡，眼皮下垂',
        '一只疲惫的熊猫，黑眼圈更重了，配字"累瘫了"',
        '一只打哈欠的小狗，眼泪都出来了，配字"困..."',
      ]);
    }
    if (content.includes('加油') || content.includes('努力') || content.includes('奋斗') || content.includes('冲')) {
      return this.randomPick([
        '一只握拳加油的小鸭子，眼神坚定，配字"冲鸭！"',
        '一只举重的小仓鼠，肌肉鼓起，配字"加油！"',
        '一只奔跑的柴犬，充满斗志，配字"冲冲冲"',
        '一只挥舞旗帜的小熊，热血沸腾，配字"奥利给"',
      ]);
    }
    if (content.includes('谢谢') || content.includes('感谢') || content.includes('感激') || content.includes('多谢')) {
      return this.randomPick([
        '一只鞠躬的小柴犬，双手合十，配字"谢谢你"',
        '一只感激的小兔子，眼含泪光，配字"太感谢了"',
        '一只送花的小熊，温暖的笑容，配字"感恩"',
        '一只作揖的小猫，恭敬的表情，配字"多谢"',
      ]);
    }
    if (content.includes('对不起') || content.includes('抱歉') || content.includes('不好意思') || content.includes('sorry')) {
      return this.randomPick([
        '一只低头认错的小狗，可怜巴巴的表情，配字"对不起"',
        '一只跪地求饶的小猫，眼泪汪汪，配字"原谅我"',
        '一只委屈的小企鹅，低着头，配字"我错了"',
        '一只认错的小熊，双手合十，配字"抱歉"',
      ]);
    }
    if (content.includes('好的') || content.includes('收到') || content.includes('明白') || content.includes('了解')) {
      return this.randomPick([
        '一只竖起大拇指的柴犬，配字"OK！"',
        '一只敬礼的小企鹅，配字"收到！"',
        '一只点头的小猫头鹰，配字"明白"',
        '一只比OK手势的小熊猫，配字"了解"',
      ]);
    }
    if (content.includes('无语') || content.includes('服了') || content.includes('醉了') || content.includes('晕')) {
      return this.randomPick([
        '一只翻白眼的小猫，配字"无语..."',
        '一只扶额的柴犬，一脸无奈，配字"服了"',
        '一只晕倒的小鸭子，眼睛转圈圈，配字"我晕"',
        '一只摊手的小熊，表情无奈，配字"醉了"',
      ]);
    }
    if (content.includes('爱') || content.includes('喜欢') || content.includes('❤') || content.includes('么么')) {
      return this.randomPick([
        '一只比心的小猫，眼睛是爱心形状，配字"爱你哦"',
        '一只亲亲的小狗，嘴巴嘟起，配字"么么哒"',
        '一只抱着爱心的小熊，满脸幸福，配字"喜欢你"',
        '一只害羞的小兔子，脸红红的，配字"❤"',
      ]);
    }
    if (content.includes('安慰') || content.includes('没关系') || content.includes('别担心') || content.includes('会好的')) {
      return this.randomPick([
        '一只张开双臂要抱抱的小熊，温暖的表情，配字"抱抱"',
        '一只拍肩膀的小狗，温柔的眼神，配字"没事的"',
        '一只递纸巾的小猫，关心的表情，配字"别哭"',
        '一只微笑的水豚，平静祥和，配字"会好的"',
      ]);
    }
    if (content.includes('吃') || content.includes('饿') || content.includes('美食') || content.includes('好吃')) {
      return this.randomPick([
        '一只流口水的柴犬，眼睛发光，配字"好饿"',
        '一只抱着食物的仓鼠，腮帮子鼓鼓的，配字"真香"',
        '一只舔嘴唇的小猫，满足的表情，配字"好吃！"',
        '一只吃竹子的熊猫，幸福的表情，配字"干饭人"',
      ]);
    }
    if (content.includes('钱') || content.includes('穷') || content.includes('工资') || content.includes('发财')) {
      return this.randomPick([
        '一只数钱的小猫，眼睛发光，配字"发财了"',
        '一只空钱包的小狗，眼泪汪汪，配字"穷"',
        '一只招财猫，举着金币，配字"恭喜发财"',
        '一只打工的小熊，背着公文包，配字"搬砖中"',
      ]);
    }

    // 根据情感基调生成 - 使用多样化的动物
    if (emotionalTone) {
      const tonePrompts: Record<string, string[]> = {
        happy: [
          '一只开心跳舞的柴犬，眼睛弯成月牙，卡通风格',
          '一只欢呼的小企鹅，翅膀举高高，配字"耶！"',
          '一只蹦蹦跳跳的小兔子，耳朵飘起来，配字"开心"',
        ],
        sad: [
          '一只难过的小海豹，眼泪汪汪，委屈的表情',
          '一只伤心的小熊猫，抱着竹子，配字"难过"',
          '一只哭泣的小企鹅，低着头，翅膀下垂',
        ],
        angry: [
          '一只愤怒的狼，眼睛发红，獠牙外露，冒着怒火',
          '一只生气的河豚，鼓成一个球，满脸怒气',
          '一只炸毛的小猫，眉毛倒竖，配字"生气！"',
        ],
        surprised: [
          '一只惊讶的猫头鹰，眼睛瞪成铜铃，羽毛炸开',
          '一只震惊的水獭，双手捂脸，表情夸张',
          '一只目瞪口呆的兔子，耳朵竖直，配字"啥？"',
        ],
        comfort: [
          '一只温暖的小熊，张开双臂，配字"抱抱"',
          '一只微笑的水豚，平静祥和，配字"没事的"',
          '一只拍肩膀的小狗，温柔的眼神，配字"别担心"',
        ],
        funny: [
          '一只搞怪的柴犬，做鬼脸，配字"嘿嘿"',
          '一只戴墨镜的小猪，痞痞的笑容，配字"酷"',
          '一只跳舞的小鸭子，动作滑稽，配字"摇起来"',
        ],
        grateful: [
          '一只感激的小兔子，双手合十，配字"谢谢"',
          '一只鞠躬的柴犬，恭敬的表情，配字"感恩"',
          '一只送花的小熊，温暖的笑容，配字"谢谢你"',
        ],
        apologetic: [
          '一只认错的小狗，低着头，配字"对不起"',
          '一只委屈的小企鹅，眼泪汪汪，配字"我错了"',
          '一只跪地的小猫，可怜巴巴，配字"原谅我"',
        ],
        neutral: [
          '一只思考的猫头鹰，托着下巴，若有所思',
          '一只喝咖啡的小熊，悠闲的表情，配字"摸鱼中"',
          '一只挥手的小企鹅，友好的表情，配字"嗨"',
        ],
      };
      const prompts = tonePrompts[emotionalTone] || tonePrompts.neutral;
      return this.randomPick(prompts);
    }

    // 默认表情包 - 随机选择不同动物
    return this.randomPick([
      '一只可爱的柴犬，表情生动有趣，卡通风格，简洁可爱',
      '一只呆萌的小企鹅，圆滚滚的身体，Q版风格',
      '一只软萌的小熊猫，抱着竹子，可爱的表情',
      '一只机灵的小仓鼠，腮帮子鼓鼓的，卡通风格',
      '一只慵懒的小猫，眯着眼睛，悠闲的表情',
    ]);
  }

  /**
   * 从数组中随机选择一个元素
   */
  private randomPick<T>(arr: T[]): T {
    return arr[Math.floor(Math.random() * arr.length)];
  }

  /**
   * 生成表情包
   * @param prompt 表情包描述
   * @returns 生成的表情包 URL
   */
  async generate(prompt: string): Promise<GeneratedEmoji> {
    const apiKey = defaultApiService.getConfig().apiKey;

    if (!apiKey) {
      throw new Error('API 密钥未配置');
    }

    // 优化提示词，使其更适合生成表情包
    const enhancedPrompt = this.enhancePrompt(prompt);

    const response = await fetch(this.apiUrl, {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${apiKey}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        model: 'Qwen/Qwen-Image',
        prompt: enhancedPrompt,
        image_size: '512x512',
        seed: Math.floor(Math.random() * 10000),
        cfg: 4,
        num_inference_steps: 20,
      }),
    });

    if (!response.ok) {
      const errorText = await response.text();
      throw new Error(`图片生成失败: ${errorText}`);
    }

    const result: ImageGenerationResponse = await response.json();

    if (result.status !== 'success' || !result.images || result.images.length === 0) {
      throw new Error(result.error || '图片生成失败');
    }

    return {
      id: `emoji_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
      url: result.images[0],
      prompt: prompt,
      timestamp: new Date(),
    };
  }

  /**
   * 优化提示词
   */
  private enhancePrompt(prompt: string): string {
    // 背景要求：纯色背景，避免马赛克或复杂背景
    const backgroundRequirement = '纯白色背景，干净简洁，无任何图案或纹理';
    
    // 如果提示词已经很详细，直接返回
    if (prompt.length > 50) {
      return `表情包风格，${prompt}，${backgroundRequirement}，简洁可爱，适合聊天使用`;
    }

    // 简单提示词，添加更多细节
    return `生成一个表情包：${prompt}，卡通风格，Q版可爱，表情夸张有趣，${backgroundRequirement}，适合微信聊天使用`;
  }

  /**
   * 根据情感生成表情包建议提示词
   */
  static getSuggestedPrompts(emotion: string): string[] {
    const suggestions: Record<string, string[]> = {
      happy: [
        '一只开心跳舞的柴犬，眼睛弯成月牙',
        '一只欢呼的小企鹅，翅膀举高高',
        '一只蹦跳的小兔子，配字"耶！"',
        '一只笑出眼泪的仓鼠，配字"笑死"',
      ],
      sad: [
        '一只流泪的小海豹，配字"好难过"',
        '一只伤心的小熊猫，抱着竹子哭泣',
        '一只委屈的小企鹅，低着头',
        '一只哭泣的小兔子，眼泪汪汪',
      ],
      angry: [
        '一只愤怒的狼，眼睛发红，獠牙外露',
        '一只生气的河豚，鼓成一个球',
        '一只炸毛的小猫，配字"气死了"',
        '一只愤怒的小狮子，鬃毛炸开',
      ],
      funny: [
        '一只戴墨镜的小猪，痞痞的笑容',
        '一只震惊的柴犬，眼睛瞪大嘴巴张开',
        '一只翻白眼的猫头鹰，配字"无语"',
        '一只跳舞的小鸭子，动作滑稽',
      ],
      comfort: [
        '一只比心的小熊，配字"爱你哦"',
        '一只张开双臂的水豚，温暖的表情',
        '一只递纸巾的小狗，配字"别哭"',
        '一只拍肩膀的小熊猫，配字"没事的"',
      ],
      grateful: [
        '一只鞠躬的柴犬，配字"谢谢"',
        '一只双手合十的小兔子，感激的表情',
        '一只送花的小熊，配字"感谢你"',
        '一只作揖的小企鹅，恭敬的表情',
      ],
      apologetic: [
        '一只低头认错的小狗，配字"对不起"',
        '一只可怜巴巴的小企鹅，眼泪汪汪',
        '一只跪地求饶的小猫，配字"原谅我"',
        '一只委屈的小熊，配字"我错了"',
      ],
      tired: [
        '一只趴着的树懒，配字"好累"',
        '一只打哈欠的考拉，眼皮下垂',
        '一只疲惫的熊猫，黑眼圈加重',
        '一只困倦的小狗，配字"困..."',
      ],
      neutral: [
        '一只思考的猫头鹰，托着下巴',
        '一只挥手的小企鹅，配字"嗨"',
        '一只喝咖啡的小熊，配字"摸鱼中"',
        '一只悠闲的水豚，泡温泉的样子',
      ],
    };

    return suggestions[emotion] || suggestions.neutral;
  }
}

// 导出单例
export const emojiGenerator = new EmojiGenerator();
